package com.wr.async.Test;

import org.springframework.web.bind.annotation.RequestMapping;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.function.Supplier;

/**
 * 虽然方法很多但有个特征：
 *
 * 以Async结尾的方法签名表示是在异步线程里执行，没有以Async结尾的方法则是由主线程调用
 * 如果参数里有Runnable类型，则没有返回结果，即纯消费的方法
 * 如果参数里没有指定executor则默认使用forkJoinPool线程池，指定了则以指定的线程池来执行任务
 */
public class CompletableFutureTest {

    /**
     * 代码中异步任务f2需要异步任务f1的结果才能执行，但对于我们的主线程来说，无须等到f1返回结果后再调用函数f2，即不会阻塞主流程，
     * 而是告诉CompletableFuture当执行完了f1的方法再去执行f2，只有当需要最后的结果时再获取。
     *
     * // 输出结果：
     * 异步结果:hello world
     * @throws ExecutionException
     * @throws InterruptedException
     */
    public void thenApplyAsync() throws ExecutionException, InterruptedException {
        CompletableFuture<String> f1 = CompletableFuture.supplyAsync(() ->
                "hello"
        );
//        CompletableFuture.supplyAsync(new Supplier<Object>() {
//            @Override
//            public Object get() {
//                return "hello";
//            }
//        });
        // f2依赖f1的结果做转换
        CompletableFuture<String> f2 = f1.thenApplyAsync(t ->
                t + " world"
        );
        System.out.println("异步结果:" + f2.get());
    }
}
